package faker

import (
	"demo/models"
	"demo/pkg/database"
	"math"
	"math/rand"
	"time"

	"github.com/bxcodec/faker/v3"
	"github.com/sirupsen/logrus"
)

// 定义电价阶梯
const (
	firstTierUsage   = 230.0   // 第一档月均用电量下限，单位：度
	secondTierUsage  = 400.0   // 第二档月均用电量下限，单位：度
	electricityRate1 = 0.538   // 第一档电价，每度电费率，单位：元
	electricityRate2 = 0.588   // 第二档电价，每度电费率，单位：元
	electricityRate3 = 0.838   // 第三档电价，每度电费率，单位：元
)

// 生成并插入随机电费账单数据
func GenerateAndInsertRandomElectricityBills(n int) error {
	rand.Seed(time.Now().UnixNano()) // 初始化随机数种子

	for i := 0; i < n; i++ {
		// 生成随机账单日期和到期日期
		billDate := time.Date(2024, time.Month(i+1), 1, 0, 0, 0, 0, time.UTC) // 从2024年1月开始，逐月生成账单日期
		dueDate := billDate.AddDate(0, 1, 0) // 到期日期比账单日期多一个月

		// 随机生成用电量和金额
		electricityUsage := rand.Float32()*(1000-50) + 50 // 50到1000之间的随机用电量
		amount := calculateElectricityBill(electricityUsage) // 计算电费金额

		// 随机生成支付时间
		payTime := generateRandomDate(billDate.Format("2006-01-02"), dueDate.Format("2006-01-02"))

		// 创建电费账单对象
		bill := models.ElectricityBills{
			UserId:           2, // 假设用户ID为1
			EleId:            faker.UUIDDigit(), // 随机电费账单ID
			BillDate:         billDate,          // 账单日期
			ElectricityUsage: electricityUsage,  // 随机用电量
			Amount:           amount,            // 随机金额
			ElePayment:       amount,            // 电费支付金额
			EleBalanceBefore: 0,                 // 缴费前电费余额
			EleBalanceNow:    0,                 // 缴费后电费余额
			PayTime:          payTime,           // 支付时间
			Status:           "unpaid",            // 账单状态，默认为已支付
			DueDate:          dueDate,           // 到期日期
		}

		// 插入数据库
		err := database.InsertElectricityBill(&bill)
		if err != nil {
			logrus.Error("插入账单失败: ", err)
			return err
		}
	}

	return nil
}

//生成指定日期范围内的随机日期
func generateRandomDate(startDate, endDate string) time.Time {
	start, _ := time.Parse("2006-01-02", startDate)
	end, _ := time.Parse("2006-01-02", endDate)

	diff := end.Sub(start).Seconds()
	randomSec := rand.Float64() * diff
	randomDuration := time.Duration(randomSec * float64(time.Second))

	return start.Add(randomDuration)
}

// 计算电费账单金额
func calculateElectricityBill(monthlyUsage float32) (amount float32) {
	var rate float64

	// 根据月均用电量判断所处的电价档次
	if monthlyUsage <= firstTierUsage {
		rate = electricityRate1
	} else if monthlyUsage <= secondTierUsage {
		rate = electricityRate2
	} else {
		rate = electricityRate3
	}

	amount = float32(math.Round(float64(monthlyUsage) * rate * 100)) / 100
	return amount
}
